package main

import (
	"bytes"
	"context"
	"fmt"
	"github.com/chromedp/cdproto/network"
	"github.com/chromedp/chromedp"
	"github.com/makiuchi-d/gozxing"
	"github.com/makiuchi-d/gozxing/qrcode"
	goQrcode "github.com/skip2/go-qrcode"
	"github.com/syyongx/php2go"
	"goway/weixin/args"
	"image"
	"io/ioutil"
	"os"
)

// 保存Cookies
func saveCookies() chromedp.ActionFunc {
	return func(ctx context.Context) (err error) {
		if args.IsLogin {
			return
		}
		// 等待二维码登陆
		fmt.Println("waiting mp_header exits")
		if err = chromedp.WaitVisible(`#mp_header`, chromedp.ByID).Do(ctx); err != nil {
			fmt.Println(err)
			return
		}
		fmt.Println("get Cookie")

		// cookies的获取对应是在devTools的network面板中
		// 1. 获取cookies
		cookies, err := network.GetAllCookies().Do(ctx)
		if err != nil {
			fmt.Println(err)
			return
		}
		// 2. 序列化
		cookiesData, err := network.GetAllCookiesReturns{Cookies: cookies}.MarshalJSON()
		if err != nil {
			fmt.Println(err)
			return
		}
		// 3. 存储到临时文件
		if err = ioutil.WriteFile("cookies.tmp", cookiesData, 0755); err != nil {
			fmt.Println(err)
			return
		}
		return
	}
}
// 加载Cookies
func loadCookies() chromedp.ActionFunc {
	return func(ctx context.Context) (err error) {
		// 如果cookies临时文件不存在则直接跳过
		if _, _err := os.Stat("cookies.tmp"); os.IsNotExist(_err) {
			return
		}

		// 如果存在则读取cookies的数据
		cookiesData, err := ioutil.ReadFile("cookies.tmp")
		if err != nil {
			return
		}

		// 反序列化
		cookiesParams := network.SetCookiesParams{}
		if err = cookiesParams.UnmarshalJSON(cookiesData); err != nil {
			return
		}
		args.Cookies=cookiesParams.Cookies
		// 设置cookies
		return network.SetCookies(cookiesParams.Cookies).Do(ctx)
	}
}

func getCode() chromedp.ActionFunc {
	return func(ctx context.Context) (err error) {
		// 1. 用于存储图片的字节切片
		if args.IsLogin {
			return
		}
		var code []byte
		fmt.Println("getCoding.....")
		// 2. 截图
		// 注意这里需要注明直接使用ID选择器来获取元素（chromedp.ByID）
		if err = chromedp.Screenshot(`#header > div.banner > div > div > div.login__type__container.login__type__container__scan > img`, &code, chromedp.ByID).Do(ctx); err != nil {
			return
		}
		fmt.Println("getCoding over")
		if err = ioutil.WriteFile("code.png", code, 0755); err != nil {
			return
		}
		return

		// 3. 把二维码输出到标准输出流
		if err = printQRCode(code); err != nil {
			fmt.Println("printQrcode",err)
			return err
		}
		return

	}
}
func printQRCode(code []byte) (err error) {
	// 1. 因为我们的字节流是图像，所以我们需要先解码字节流
	img, _, err := image.Decode(bytes.NewReader(code))
	if err != nil {
		fmt.Println("decode",err)
		return
	}

	// 2. 然后使用gozxing库解码图片获取二进制位图
	bmp, err := gozxing.NewBinaryBitmapFromImage(img)
	if err != nil {
		fmt.Println("NewBinaryBitmapFromImage",err)
		return
	}

	// 3. 用二进制位图解码获取gozxing的二维码对象
	res, err := qrcode.NewQRCodeReader().Decode(bmp, nil)
	if err != nil {
		fmt.Println(`NewQRCodeReader`,err)
		return
	}
	qr, err := goQrcode.New(res.String(), goQrcode.High)
	if err != nil {

		fmt.Println("goQrcode.New",err)
		return
	}

	// 5. 输出到标准输出流
	fmt.Println(qr.ToSmallString(false))
	return
}
func getToken(url string)(token string ,err error)  {
	var res =make(map[string]interface{})
	err=php2go.ParseStr(url,res)
	if err!=nil{
		return
	}
	token=res[`token`].(string)
	return
}
func BuildCookies(param []*network.CookieParam)string  {
	cookie:=``
	for _,v:=range param{
		cookie=fmt.Sprintf("%s%s=%s;",cookie,v.Name,v.Value)
	}
	return cookie
}
